﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace LandingPlan
{
    /// <summary>
    /// 项目信息变更接口
    /// </summary>
    public interface IProjectChange
    {
        /// <summary>
        /// 获取变更的项目信息集合
        /// </summary>
        /// <param name="filter"></param>
        /// <returns></returns>
        PageList<ProjectChangedInfo> GetProjectInfoChangedList(ProjectInfoChangedParam filter);

        /// <summary>
        /// 项目信息变更后处理
        ///     同步变更结果
        /// </summary>
        /// <param name="projectChangeResult"></param>
        void OnProjectInfoChanged(ProjectChangedResultItem projectChangeResult);
    }

    /// <summary>
    /// 项目变更筛选条件类
    ///     本参数类设计目的：额外为中间库提供查询功能（支持查询同步状态，支持分块查询）
    /// </summary>
    [Serializable]
    public class ProjectInfoChangedParam
    {
        /// <summary>
        /// 变更序列号（唯一）
        ///     一般对应于中间库的键值（视中间库情况而定，如果中间库多键值则可能拼接）
        /// </summary>
        public string SerialNo { get; set; }

        /// <summary>
        /// 财务项目编号
        /// </summary>
        public string ProjCode { get; set; }

        /// <summary>
        /// 同步状态
        /// </summary>
        ///<see cref="ProjectInfoChangedStatusConst"/>
        public string SycnStatus { get; set; }

        /// <summary>
        /// 分页尺寸
        /// </summary>
        public int PageSize { get; set; }

        /// <summary>
        /// 分页页码（为负值不分页）
        /// </summary>
        public int PageIndex { get; set; }
    }

    /// <summary>
    /// 项目变更信息模型
    /// </summary>
    [Serializable]
    public class ProjectChangedInfo
    {
        /// <summary>
        /// 变更序列号（唯一）
        ///     一般对应于中间库的键值（视中间库情况而定，如果中间库多键值则可能拼接）
        /// </summary>
        public string SerialNo { get; set; }

        /// <summary>
        /// 财务项目编号
        /// </summary>
        public string ProjCode { get; set; }

        /// <summary>
        /// 项目变更类型
        /// </summary>
        ///<see cref="ProjInfoChangeType"/>
        public string ChangeType { get; set; }

        /// <summary>
        /// 新的变动信息
        /// </summary>
        public string NewContent { get; set; }


        /// <summary>
        /// 项目变更状态
        /// </summary>
        ///<see cref="ProjectInfoChangedStatusConst"/>
        public string ChangeStatus { get; set; }

        /// <summary>
        /// 变动结果信息
        /// </summary>
        public string Message { get; set; }
    }

    /// <summary>
    /// 项目变更结果模型
    /// </summary>
    [Serializable]
    public class ProjectChangedResultItem
    {
        /// <summary>
        /// 变更序列号（唯一）
        ///     一般对应于中间库的键值（视中间库情况而定，如果中间库多键值则可能拼接）
        /// </summary>
        public string SerialNo { get; set; }

        /// <summary>
        /// 财务项目编号
        /// </summary>
        public string ProjCode { get; set; }

        /// <summary>
        /// 项目信息变更状态
        /// </summary>
        ///<see cref="ProjectInfoChangedStatusConst"/>
        public string ChangeStatus { get; set; }

        /// <summary>
        /// 变动结果信息
        /// </summary>
        public string Message { get; set; }
    }

    #region Consts

    /// <summary>
    /// 项目信息变更状态
    /// </summary>
    [Serializable]
    public class ProjectInfoChangedStatusConst
    {
        /// <summary>
        /// 未同步
        /// </summary>
        public const string A = "A";

        /// <summary>
        /// 同步成功
        /// </summary>
        public const string B = "B";

        /// <summary>
        /// 同步失败
        /// </summary>
        public const string C = "C";

        private static readonly Dictionary<string, string> Names = new Dictionary<string, string>
        {
            { A, "未同步" },
            { B, "同步成功" },
            { C, "同步失败" }
        };

        /// <summary>
        /// 常量列表
        /// </summary>
        /// <returns></returns>
        public static string[] GetAllKeys()
        {
            return Names.Keys.ToArray();
        }

        /// <summary>
        /// 获取名称
        /// </summary>
        /// <param name="key"></param>
        /// <returns></returns>
        public static string GetName(string key)
        {
            return key == null || !Names.ContainsKey(key) ? string.Empty : Names[key];
        }

        /// <summary>
        /// 获取同步状态键值列表
        /// </summary>
        /// <returns></returns>
        public static List<KeyValuePair<string, string>> GetList()
        {
            return Names.ToList();
        }
    }

    #endregion
}
